package testCases;

import common.InitAndClose;
import org.junit.jupiter.api.*;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebElement;

import java.util.List;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class SessionListTest extends InitAndClose {

    // 点击不同的会话, 查看右方的会话名是否变成点击会话的名字
    @Order(1)
    @Test
    public void clickTest() throws InterruptedException {
        login();

        // 获取会话列表 li
        List<WebElement> liList = webDriver
                .findElement(By.cssSelector("#session-list"))
                .findElements(By.tagName("li"));

        // 遍历 li 点击, 对比
        for (WebElement li : liList) {
            // 得到会话名
            String sessionName = li.findElement(By.tagName("h3")).getText();
            // 点击
            li.click();
            // 获取右边聊天界面的会话名
            String chatSessionName = webDriver
                    .findElement(By.cssSelector("body > div.client-container > div > div.right > div.title"))
                    .getText();

            // 对比
            Assertions.assertEquals(sessionName, chatSessionName);
        }

        System.out.println("测试通过");
    }

    // 点击不同的会话, 查看当前选中的会话在会话列表中是否是被选中的状态
    @Order(2)
    @Test
    public void selectedTest() {
        login();

        // 获取会话列表 li
        List<WebElement> liList = webDriver
                .findElement(By.cssSelector("#session-list"))
                .findElements(By.tagName("li"));

        // 遍历 li 点击, 查看是否被选中
        for (WebElement li : liList) {
            // 获取当前 class 名称
            String beforeClickClassName = li.getAttribute("class");
            // 点击
            li.click();
            // 查看 class 的名称是否是 selected
            String afterClickClassName = li.getAttribute("class");
            System.out.println("beforeClickClassName: " + beforeClickClassName
                    + " afterClickClassName: " + afterClickClassName);

            Assertions.assertEquals(afterClickClassName, "selected");
        }
        System.out.println("测试通过");
    }

    // 从好友列表中点进去的会话是否会被置顶(变成会话列表中的第一个并且是选中状态)
    @Order(3)
    @Test
    public void clickFromFriendList() {
        login();

        // 获取好友列表 li
        List<WebElement> liList = webDriver
                .findElement(By.xpath("//*[@id=\"friend-list\"]"))
                .findElements(By.tagName("li"));

        // 遍历 li
        for (WebElement li : liList) {
            // 使用 js 获取点击的好友的名字
            String friendName =
                    ((JavascriptExecutor) webDriver).executeScript(
                            "return arguments[0].innerText;", li.findElement(By.tagName("h4"))
                    ).toString();
            // 使用 js 点击 (元素当前是隐藏状态)
            ((JavascriptExecutor) webDriver).executeScript(
                    "arguments[0].click();", li
            );

            // 获取当前会话列表中第一个会话的名称和 className
            String top1SessionName = webDriver
                    .findElement(By.cssSelector("#session-list > li.selected > h3:nth-child(1)"))
                    .getText();
            String top1SessionClassName = webDriver
                    .findElement(By.cssSelector("#session-list > li.selected"))
                    .getAttribute("class");

            // 查看 sessionName 是否对应, className 是否是 selected
            System.out.println("friendName: " + friendName + " top1SessionName: " + top1SessionName);
            Assertions.assertEquals(friendName, top1SessionName);
            Assertions.assertEquals(top1SessionClassName, "selected");
            System.out.println("测试通过");
        }
    }
}
